#ifndef NEURON_H_
#define NEURON_H_

#include <vector>
#include <cassert>
#include <cstdlib>
#include <ctime>
#include <iostream>

#include "Activation.h"
#include "Learning.h"
#include "Defines.h"
#include "vdouble.h"

using namespace std;

// Classe que representa um neurônio
class Neuron
{

public:

    // Constrói um neurônio passando seu índice, o nº de variáveis de entrada, a função de ativação e o aprendizado
    // Os pesos do neurônio serão calculados randomicamente
    Neuron(uint index, uint nInVars, Activation& activation, Learning& learning);

    // Constrói um neurônio passando seu índice, o nº de variáveis de entrada, a função de ativação e o aprendizado
    // Os pesos do neurônio são passados
    Neuron(uint index, uint nInVars, Activation& activation, Learning& learning, vdouble& w);

    virtual ~Neuron();

    // Retorna os pesos do neurônio
    vdouble& getWeightVector();
    // Retorna o peso da variável de entrada de índice i
    double getWeight(int i);
    // Seta o peso da variável de entrada de índice i
    void setWeight(int i, double w);
    // Reseta os pesos
    void resetWeights();
    // Retorna o output do neurônio dada uma entrada
    double getOutput(vdouble& input);
    // Realiza o treinamento do neurônio passando a entrada e o erro feito
    void train(vdouble& input, double error);
    // Imprime os pesos
    void printWeights();

private:

    uint index;
    uint nInVars;

    Activation& activation;
    Learning& learning;

    vdouble weights;

    // Retorna um valor aleatório baixo entre 0 e 0.1
    double getRandom();

};

#endif /* NEURON_H_ */
